package org.snia.cdmi.util;

import java.util.Map;

import org.snia.cdmi.auth.Principal;
import org.snia.cdmi.model.ContainerWithAcl;
import org.snia.cdmi.model.DataObjectWithAcl;
import org.snia.cdmi.model.Permission;

public class AclUtils {

	/**
	 * 检查容器的ACL访问权限，如果具有对应的访问权限，则返回true，否则返回false. 该方法不允许传入NULL的参数
	 * 
	 * @param container
	 * @param permission
	 * @param principal
	 * @return
	 */
	public static boolean checkAcl(ContainerWithAcl container,
			Permission permission, Principal principal) {
//		判断是否是容器的拥有人。若是，可以做任何操作
		if (container.getAccessKey().equals(principal.getIdentifier())) {
			return true;
		}
		
//		判断是否具有容器操作的ACL
		Map<String, String> acl = container.getAccessControlList();
		String s_permission = acl.get(principal.getIdentifier());

		if (s_permission != null
				&& s_permission.contains(permission.toString())) {
			return true;
		}
		return false;
	}

	public static boolean checkAcl(ContainerWithAcl container,
			DataObjectWithAcl dataobject, Permission permission,
			Principal principal) {
//		判断是否是容器的拥有人。若是，可以做任何操作
		if (container.getAccessKey().equals(principal.getIdentifier())) {
			return true;
		}
//		判断是否具有容器操作的ACL，如果具有，则可操作对象
		Map<String, String> acl = container.getAccessControlList();
		String s_permission = acl.get(principal.getIdentifier());

		if (s_permission != null
				&& s_permission.contains(permission.toString())) {
			return true;
		}

//		判断是否是容器的拥有人。若是，可以做任何操作
		if (dataobject.getAccessKey().equals(principal.getIdentifier())) {
			return true;
		}
		
//		判断是否具有对象操作的ACL，如果具有，则可操作对象
		acl = dataobject.getAccessControlList();
		s_permission = acl.get(principal.getIdentifier());
		if (s_permission != null
				&& s_permission.contains(permission.toString())) {
			return true;
		}
		return false;
	}
}
